package com.day15_Stream;

import java.util.ArrayList;
import java.util.stream.Stream;

/**
 * @ClassName: Stream_demo
 * @Author: zw
 * @Description: 出百万拳，行万里路；
 * @Create 2024/3/25-00:09
 * @Version 1.0
 */
public class Stream_demo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
//        list.add("孙悟饭");
//        list.add("孙悟空");
//        list.add("龟仙人");
//        list.add("克林");
//        list.add("天津饭");
//        list.add("孙悟天");
//        list.add("孙悟天-爷爷");
        list.add("sunwufan");
        list.add("sunwukong");
        list.add("guixianren");
        list.add("kelin");
        list.add("tianjingfan");
        list.add("sunwukong");
        list.add("sunwukongyeye");
        // 按照字母顺序排序
        System.out.println("按照字母顺序排序");
        list.stream().sorted().forEach(System.out::println);
        // 按照字符串长度输出
        System.out.println("按照字符串长度输出");
        list.stream().sorted((s1,s2)-> {
            return s1.length() - s2.length();
        }).forEach(System.out::println);
        System.out.println("首先按照字符串长度输出，长度相同时，按照自然顺序输出");
        list.stream().sorted((s1,s2)-> {
            int num = s1.length() - s2.length();
            int num2 = num == 0? s1.compareTo(s2) :num;
            return num2;
        }).forEach(System.out::println);
        list.stream().filter(s -> s.startsWith("孙")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
        // 需求1: 把list集合中 孙开头的输出在控制台上
        list.stream().filter((String s) -> {
            return s.startsWith("孙");
        }).forEach(System.out::println);
        // 需求2: 把list集合中长度为3的元素输出在控制台
        System.out.println("需求2长度为3的元素输出在控制台");
        list.stream().filter(s -> s.length() == 3).forEach(System.out::println);
        // 需求3: 把list集合中以张开头的，长度为3的元素在控制台上输出
        System.out.println("需求3 list集合中以孙开头并且长度为3的");
        list.stream().filter(s -> s.startsWith("孙")).filter(s->s.length()==3).forEach(System.out::println);

        // 截取前3个数据在控制台输出
        System.out.println("limit 截取前3个数据在控制台输出");
        list.stream().limit(3).forEach(System.out::print);
        // 跳过3个数据，把剩下的元素输出在控制台
        System.out.println("skip 跳过3个数据，把剩下的元素输出在控制台");
        list.stream().skip(3).forEach(System.out::print);
        // concat
        Stream s1 = list.stream().limit(1); // 截取前1个
        Stream s2 = list.stream().skip(3);  // 跳过前3个
        System.out.println("concat 合并s1， s2 得到的流");
//        Stream.concat(s1, s2).forEach(System.out::print); // 合并s1， s2 得到的流
        // s1，s2 流合并后，去掉重复的元素
        System.out.println("concat 合并s1， s2 得到的流， 并去重");
        Stream.concat(s1,s2).distinct().forEach(System.out::print);
    }

}
